/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dominio.Profesor;
import java.util.Collection;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author eagle
 */
public class ProfesorDao {

    private EntityManager em;

    /**
     * Metodo que permite la creacion de profesores
     *
     * @param nombre
     * @param apellido
     * @param documento
     * @param especialidad
     * @param telFijo
     * @param telMovil
     * @param Direccion
     * @param nacimiento
     * @param Genero
     * @param edad
     * @param usuario
     * @return {@link Profesor}
     */
    public Profesor crearProfesor(String nombre, String apellido,
            Long documento, String especialidad, String telFijo,
            String telMovil, String Direccion, String nacimiento,
            String Genero, int edad, String usuario) {

        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");

        Profesor profesor;
        try {

            this.em = emf.createEntityManager();
            profesor = new Profesor();
            profesor.setNombreProfesor(nombre);
            profesor.setApellidoProfesor(apellido);
            profesor.setDocProfesor(documento);
            profesor.setEspecialidad(especialidad);
            profesor.setTelFijo(telFijo);
            profesor.setTelMovil(telMovil);
            profesor.setFechaNacimientoProf(nacimiento);
            profesor.setDireccionProf(Direccion);
            profesor.setGeneroProf(Genero);
            profesor.setEdadProf(edad);
            profesor.setNombreUsuario(null);
            em.getTransaction().begin();
            em.persist(profesor);
            em.getTransaction().commit();
        } catch (Exception e) {
            System.out.println("No se pudo crear al profesor " + e.getMessage());
            em.getTransaction().begin();
            return null;

        } finally {
            em.close();
            emf.close();

        }
        return profesor;
    }

    public Profesor encontrarProfesor(Long docProfesor) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        Profesor u = em.find(Profesor.class, docProfesor);// con esta funcion se busca un dato por primary key, el primer parametro es nuestra clase entidad
        em.close();
        emf.close();
        return u;
    }

    public Collection<Profesor> encontrarProfesoresSinUsuario() {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        Query query = em.createQuery("SELECT p FROM Profesor p WHERE p.nombreUsuario IS NULL");
        Collection<Profesor> p = query.getResultList();
        em.close();
        emf.close();
        return p;
    }

    public Collection<Profesor> encontrarProfesoresConUsuario() {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        Query query = em.createQuery("SELECT p FROM Profesor p WHERE p.nombreUsuario IS NOT NULL");
        Collection<Profesor> p = query.getResultList();
        em.close();
        emf.close();
        return p;
    }
    /*
     * public void borrarProfesor(String nombreProfesor) { //Profesor u =
     * encontrarProfesor(nombreProfesor);//en este caso podemos borrar un
     * Profesor por nombre if (u != null) {//si no lo encuentra por supuesto no
     * lo intenta borrar em.remove(u);// borra de la tabla ese registro } }
     */

    public boolean actualizarProfesor(Long docActual, String nombre, String apellido,
            String especialidad, String telFijo,
            String telMovil, String Direccion, String nacimiento,
            String Genero, int edad) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SiaPersistencia");
        Profesor p;

        try {

            this.em = emf.createEntityManager();
            p = em.find(Profesor.class, docActual);

            if (p != null) {
                p.setNombreProfesor(nombre);
                p.setApellidoProfesor(apellido);
                p.setEspecialidad(especialidad);
                p.setTelFijo(telFijo);
                p.setTelMovil(telMovil);
                p.setFechaNacimientoProf(nacimiento);
                p.setDireccionProf(Direccion);
                p.setGeneroProf(Genero);
                p.setEdadProf(edad);
                em.getTransaction().begin();
                em.merge(p);
                em.getTransaction().commit();
            }

        } catch (Exception e) {
            System.out.println("No se pudo actualizar el profesor" + e.getMessage());
            em.getTransaction().rollback();
            return false;
        } finally {
            em.close();
            emf.close();
        }

        return true;
    }

    public Collection<Profesor> encontrarProfesores() { //encontrar todos los Profesors
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        Query query = em.createQuery("SELECT u FROM Profesor u");// Ojo la sentencia estÃ¡ en Java Query Language, no SQL
        Collection<Profesor> p = query.getResultList(); // me guarda la lista de todos los usuarios en mi coleccion
        em.close();
        emf.close();
        return p;
    }

    public Collection<Profesor> encontrarProfesoresNoDirectores() { //encontrar todos los Profesors
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Query query = em.createQuery("SELECT p FROM Profesor p LEFT OUTER JOIN p.curso c WHERE c.idProfesor IS NULL");
        Collection<Profesor> c = query.getResultList();
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public void asignarUsuarioAProfesor(Long docProf, String nombreUsuario) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Profesor e = em.find(Profesor.class, docProf);
        e.setNombreUsuario(nombreUsuario);
        em.getTransaction().commit();
        em.close();
        emf.close();
    }

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }
}
